package lanqiao._02算法训练.page01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;

/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec
 * 问题描述
 * 　　JiaoShou在爱琳大陆的旅行完毕，即将回家，为了纪念这次旅行，他决定带回一些礼物给好朋友。
 * 　　在走出了怪物森林以后，JiaoShou看到了排成一排的N个石子。
 * 　　这些石子很漂亮，JiaoShou决定以此为礼物。
 * 　　但是这N个石子被施加了一种特殊的魔法。
 * 　　如果要取走石子，必须按照以下的规则去取。
 * 　　每次必须取连续的2*K个石子，并且满足前K个石子的重量和小于等于S，后K个石子的重量和小于等于S。
 * 　　由于时间紧迫，Jiaoshou只能取一次。
 * 　　现在JiaoShou找到了聪明的你，问他最多可以带走多少个石子。
 * 输入格式
 * 　　第一行两个整数N、S。
 * 　　第二行N个整数，用空格隔开，表示每个石子的重量。
 * 输出格式
 * 　　第一行输出一个数表示JiaoShou最多能取走多少个石子。
 * 样列输入
 * 　　8 3
 * 　　1 1 1 1 1 1 1 1
 * 样列输出
 * 　　6
 * 样列解释
 * 　　任意选择连续的6个1即可。
 * 数据规模和约定
 * 　　对于20%的数据：N<=1000
 * 　　对于70%的数据：N<=100,000
 * 　　对于100%的数据：N<=1000,000，S<=10^12，每个石子的重量小于等于10^9，且非负
 * 思路：
 * 二分查找最大的满足要求的窗口
 * 前缀和计算区间的和
 * 大数据量的输入适用BufferedReader
 * @since 2022 - 10 - 29 - 14:08
 */
public class _05礼物 {
}
class Main5{
    static long[] sums;
    static long[] nums;
    static long s;
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer tokenizer = new StringTokenizer("");
    static String next() throws IOException {
        if(!tokenizer.hasMoreTokens()){
            tokenizer = new StringTokenizer(reader.readLine());
        }
        return tokenizer.nextToken();
    }
    static long nextLong() throws IOException {
        return Long.parseLong(next());
    }
    static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public static void main(String[] args) throws IOException {
        //读入很多数据，Scanner 会面临超时、内存超限的情况
        int n = nextInt();
        s = nextLong();
        nums = new long[n];
        //前缀和
        sums = new long[n + 1];
        for(int i = 0; i < n; i++){
            nums[i] = nextLong();
            sums[i + 1] = sums[i] + nums[i];
        }
        //二分查找最大的 k
        int left = 0, right = n;
        while(left < right){
            // (l + r + 1) / 2
            int k = left + ((right - left + 1) >> 1);
            if(check(k)){ //这个k是满足的
                //试着找更大的k
                left = k;
            }else{
                //k太大没有满足的情况 需要减一
                right = k - 1;
            }
        }
        System.out.println(left * 2);
    }

    /*
     * 判断 2 * k 长的窗口是否有满足要求的
     */
    public static boolean check(int k){
        long leftVal, rightVal;
        for(int i = 0; i + 2 * k - 1 < nums.length; i++){
            //nums[i] 到 nums[j] 的和 = sums[j + 1] - sums[i]
            //左区间 [i, i + k - 1]
            //右区间 [i + k, i + 2k - 1]
            leftVal = sums[i + k] - sums[i];
            rightVal = sums[i + 2 * k] - sums[i + k];
            if(leftVal <= s && rightVal <= s){
                return true;
            }
        }
        return false;
    }
}
//滑动窗口超时
class Main5_1{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long s = sc.nextLong();
        long[] nums = new long[n];
        //前缀和
        long[] sums = new long[n + 1];
        for(int i = 0; i < n; i++){
            nums[i] = sc.nextLong();
            sums[i + 1] = sums[i] + nums[i];
        }
        int k = n / 2, max = 0;
        for(int i = 0; i < n; i++){
            k = (n - i) / 2;
            while(k > 1){
                //nums[i] 到 nums[j] 的和 = sums[j + 1] - sums[i]
                //左区间 [i, i + k - 1]
                long left = sums[i + k] - sums[i];
                //右区间 [i + k, i + 2k - 1]
                long right = sums[i + 2 * k] - sums[i + k];
                if(left <= s && right <= s){
                    max = Math.max(max, k * 2);
                    break;
                }
                k--;
            }
        }
        System.out.println(max);

    }
}